package com.t2tierp.pafecf.controller;

import br.com.modelo.*;
import br.com.util.JPAUtil;
import com.t2tierp.pafecf.infra.Biblioteca;
import com.t2tierp.pafecf.view.Caixa;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.sql.Connection;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.Query;

public class ProdutoController {

    public Produto consulta(String codigo) {

        EntityManager em = JPAUtil.retornarFabrica().createEntityManager();
        Query q = em.createNamedQuery("FROM Produto c WHERE c.gtin = ? OR c.codigoInterno = ? AND c.excluido = 'N'");
        q.setParameter(1, codigo);
        Produto retorno;
        try {
            retorno = (Produto) q.getSingleResult();
            em.close();
            return retorno;
        } catch (javax.persistence.NoResultException e) {
            em.close();
            return null;
        }
    }

    public Produto consultaId(Integer pId) {
        return JPAUtil.buscarPorId(Produto.class, pId);
    }

    public List<Produto> tabelaProduto() {
        return JPAUtil.buscarTodos(Produto.class);
    }

    public List<Produto> produtoFiltro(String filtroNome) {
        String procurePor = "%" + filtroNome + "%";
        EntityManager em = JPAUtil.retornarFabrica().createEntityManager();
        Query q = em.createNamedQuery("FROM Produto c WHERE c.nome = ? AND c.excluido = 'N'");
        q.setParameter(1, procurePor);
        List<Produto> retorno = q.getResultList();
        em.close();
        return retorno;
    }

    public void atualizaEstoque(List<EcfVendaDetalhe> listaVendaDetalhe, boolean vendaCancelada) {
        Produto produto;
        BigDecimal quantidade;
        BigDecimal quantidadeFichaTecnica;
        for (int i = 0; i < listaVendaDetalhe.size(); i++) {
            if (listaVendaDetalhe.get(i).getCancelado().toString().equals("N")) {
                produto = consultaId(listaVendaDetalhe.get(i).getIdEcfProduto().getId());

                if (produto.getIppt().toString().equals("P")) {
                    FichaTecnicaController fichaControl = new FichaTecnicaController();
                    List<FichaTecnica> listaFichaTecnica = fichaControl.consultaFichaTecnica(produto.getId());

                    for (int j = 0; j < listaFichaTecnica.size(); j++) {
                        produto = consultaId(listaFichaTecnica.get(j).getIdProdutoFilho());
                        quantidade = listaVendaDetalhe.get(i).getQuantidade();
                        quantidadeFichaTecnica = listaFichaTecnica.get(j).getQuantidade();

                        quantidade = quantidade.multiply(quantidadeFichaTecnica).setScale(Caixa.configuracao.getDecimaisQuantidade(), RoundingMode.DOWN);

                        atualizaEstoque(produto, quantidade, vendaCancelada);
                    }
                } else {
                    quantidade = listaVendaDetalhe.get(i).getQuantidade();
                    atualizaEstoque(produto, quantidade, vendaCancelada);
                }
            }
        }
    }

    private void atualizaEstoque(Produto produto, BigDecimal quantidade, boolean vendaCancelada) {
        try {
            String atualizaProduto = "update PRODUTO set "
                    + "QTD_ESTOQUE = ?, "
                    + "HASH_TRIPA = ?, "
                    + "HASH_INCREMENTO = ? "
                    + "where ID = ? ";

            BigDecimal estoqueAtual;
            String tripa;
            SimpleDateFormat formatoData = new SimpleDateFormat("dd/MM/yyyy");

            estoqueAtual = produto.getQtdEstoque();
            if (vendaCancelada) {
                estoqueAtual = estoqueAtual.add(quantidade);
            } else {
                estoqueAtual = estoqueAtual.subtract(quantidade);
            }
            estoqueAtual = estoqueAtual.setScale(Caixa.configuracao.getDecimaisQuantidade(), RoundingMode.DOWN);

            //produto.setQuantidadeEstoqueAnterior(produto.getQuantidadeEstoque());
            produto.setQtdEstoque(estoqueAtual);
            //produto.setDataEstoque(new Date());

            tripa = produto.getGtin()
                    + produto.getDescricao()
                    + produto.getDescricaoPdv()
                    + Biblioteca.formatoDecimal("Q", Double.parseDouble(produto.getQtdEstoque().toString()))
                    + formatoData.format(produto.getDataEstoque())
                    + produto.getCst()
                    + Biblioteca.formatoDecimal("V", Double.parseDouble(produto.getTaxaIcms().toString()))
                    + Biblioteca.formatoDecimal("V", Double.parseDouble(produto.getValorVenda().toString()))
                    + "0";
            produto.setHashTripa(Biblioteca.MD5String(tripa));
            produto.setHashIncremento(-1);

            JPAUtil.mergeObjeto(produto);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void atualizaEstoqueGeral(List<EcfVendaDetalhe> listaVendaDetalhe, Date dataEstoque) {
        Connection con = null;
        try {
            String atualizaProduto = "update PRODUTO set "
                    + "QTD_ESTOQUE_ANTERIOR = ?, "
                    + "DATA_ESTOQUE = ?, "
                    + "HORA_ESTOQUE = ?, "
                    + "HASH_TRIPA = ?, "
                    + "HASH_INCREMENTO = ? "
                    + "where ID = ? ";

            String tripa;
            SimpleDateFormat formatoData = new SimpleDateFormat("dd/MM/yyyy");
            SimpleDateFormat formatoHora = new SimpleDateFormat("HH:mm:ss");

            List<Produto> listaProduto = tabelaProduto();
            Produto produto;
            for (int i = 0; i < listaProduto.size(); i++) {
                produto = listaProduto.get(i);
                produto.setQtdEstoqueAnterior(produto.getQtdEstoque());
                //se o primeiro documento do dia for uma venda, desconsidera as quantidades vendidas para atualizar o estoque
                if (listaVendaDetalhe != null) {
                    for (int j = 0; j < listaVendaDetalhe.size(); j++) {
                        if (produto.getId() == listaVendaDetalhe.get(j).getIdEcfProduto().getId()) {
                            produto.setQtdEstoqueAnterior(produto.getQtdEstoque().add(listaVendaDetalhe.get(j).getQuantidade()));
                            break;
                        }
                    }
                }

                produto.setDataEstoque(dataEstoque);
                produto.setHoraEstoque(formatoHora.format(dataEstoque));

                tripa = produto.getGtin()
                        + produto.getDescricao()
                        + produto.getDescricaoPdv()
                        + Biblioteca.formatoDecimal("Q", Double.parseDouble(produto.getQtdEstoque().toString()))
                        + formatoData.format(produto.getDataEstoque())
                        + produto.getCst()
                        + Biblioteca.formatoDecimal("V", Double.parseDouble(produto.getTaxaIcms().toString()))
                        + Biblioteca.formatoDecimal("V", Double.parseDouble(produto.getValorVenda().toString()))
                        + "0";
                produto.setHashTripa(Biblioteca.MD5String(tripa));
                produto.setHashIncremento(-1);

                JPAUtil.mergeObjeto(produto);
            }
            String atualizaEstoque = "update ECF_ESTOQUE set "
                    + "ID_ECF_EMPRESA = ?, "
                    + "ID_ECF_IMPRESSORA = ?, "
                    + "NUMERO_SERIE_ECF = ?, "
                    + "DATA_ATUALIZACAO = ?, "
                    + "HORA_ATUALIZACAO = ?, "
                    + "HASH_TRIPA = ?, "
                    + "HASH_INCREMENTO = ? ";
            tripa = Caixa.configuracao.getIdEcfImpressora().getSerie()
                    + formatoData.format(dataEstoque)
                    + formatoHora.format(dataEstoque)
                    + "0";
            Estoque estoque = new Estoque();
            estoque.setIdEcfEmpresa(Caixa.configuracao.getIdEcfEmpresa());
//            estoque.setIdEcfEmpresa(JPAUtil.buscarPorId(Empresa.class, Caixa.configuracao.getIdEmpresa()));
            estoque.setIdEcfImpressora(Caixa.configuracao.getIdEcfImpressora());
            estoque.setNumeroSerieEcf(Caixa.configuracao.getIdEcfImpressora().getSerie());
            estoque.setDataAtualizacao(dataEstoque);
            estoque.setHoraAtualizacao(formatoHora.format(dataEstoque));
            estoque.setHashTripa(Biblioteca.MD5String(tripa));
            estoque.setHashIncremento(-1);
            JPAUtil.mergeObjeto(estoque);

        } catch (Exception e) {
            e.printStackTrace();
            try {
                con.rollback();
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
        }
    }

    public List<Produto> produtoFiltro(String filtroNome, String ippt) {
        String procurePor = "%" + filtroNome + "%";
        EntityManager em = JPAUtil.retornarFabrica().createEntityManager();
        Query q = em.createNamedQuery("FROM Produto c WHERE c.nome = ? AND c.excluido = 'N' AND c.ippt = ?");
        q.setParameter(1, procurePor);
        q.setParameter(1, ippt);
        List<Produto> retorno = q.getResultList();
        em.close();
        return retorno;
    }
}
